source('../settings/settings.R')
source('commonFunctions.R')
persons <- SELECTED_SUBJECTS
all_Drive3 <- read.csv('..//data/processed/distancewise/TT1_Drive_3_30m_30m.csv')
all_Drive3$Subject <- as.factor(all_Drive3$Subject)
all_Drive3$logPerspiration <- log(all_Drive3$Perspiration)
mean_pp <- vector(mode="list", length=length(persons))
names(mean_pp) <- persons
std_pp <- vector(mode="list", length=length(persons))
names(std_pp) <- persons
# Segments
mean_pp_seg0 <- vector(mode="list", length=length(persons))
names(mean_pp_seg0) <- persons
mean_pp_seg1 <- vector(mode="list", length=length(persons))
names(mean_pp_seg1) <- persons
mean_pp_seg2 <- vector(mode="list", length=length(persons))
names(mean_pp_seg2) <- persons
mean_pp_seg3 <- vector(mode="list", length=length(persons))
names(mean_pp_seg3) <- persons
mean_pp_seg4 <- vector(mode="list", length=length(persons))
names(mean_pp_seg4) <- persons
mean_pp_max <- vector(mode="list", length=length(persons))
names(mean_pp_max) <- persons
std_pp_seg0 <- vector(mode="list", length=length(persons))
names(std_pp_seg0) <- persons
std_pp_seg1 <- vector(mode="list", length=length(persons))
names(std_pp_seg1) <- persons
std_pp_seg2 <- vector(mode="list", length=length(persons))
names(std_pp_seg2) <- persons
std_pp_seg3 <- vector(mode="list", length=length(persons))
names(std_pp_seg3) <- persons
std_pp_seg4 <- vector(mode="list", length=length(persons))
names(std_pp_seg4) <- persons
std_pp_max <- vector(mode="list", length=length(persons))
names(std_pp_max) <- persons
for(p in persons) {
pData <- all_Drive3[(all_Drive3$Subject==as.integer(p) | all_Drive3$Subject==p),]
pData_act3 <- pData[pData$Activity==3,]
pData_seg0 <- pData[pData$Phase==0,]
pData_seg1 <- pData[pData$Phase==1 & pData$Activity==3 & pData$Time < 110,]
pData_seg2 <- pData[pData$Phase==2 & pData$Activity==3 & pData$Time < 250,]
pData_seg3 <- pData[pData$Phase==3 & pData$Activity==3 & pData$Time < 350,]
pData_seg4 <- pData[pData$Phase==4 & pData$Activity==3,]
mean_pp[[p]] <- mean(pData_act3$ppLogNormalized)
std_pp[[p]] <- sd(pData$ppLogNormalized)
mean_pp_seg0[[p]] <- mean(pData_seg0$ppLogNormalized)
mean_pp_seg1[[p]] <- mean(pData_seg1$ppLogNormalized)
mean_pp_seg2[[p]] <- mean(pData_seg2$ppLogNormalized)
mean_pp_seg3[[p]] <- mean(pData_seg3$ppLogNormalized)
mean_pp_seg4[[p]] <- mean(pData_seg4$ppLogNormalized)
mean_pp_max[[p]] <- max(mean_pp_seg1[[p]], mean_pp_seg2[[p]], mean_pp_seg3[[p]], mean_pp_seg4[[p]])
std_pp_seg0[[p]] <- sd(pData_seg0$ppLogNormalized)
std_pp_seg1[[p]] <- sd(pData_seg1$ppLogNormalized)
std_pp_seg2[[p]] <- sd(pData_seg2$ppLogNormalized)
std_pp_seg3[[p]] <- sd(pData_seg3$ppLogNormalized)
std_pp_seg4[[p]] <- sd(pData_seg4$ppLogNormalized)
std_pp_max[[p]] <- max(std_pp_seg1[[p]], std_pp_seg2[[p]], std_pp_seg3[[p]], std_pp_seg4[[p]])
}
plt_AllAcc <- vector(mode="list", length=length(persons))
names(plt_AllAcc) <- persons
COLOR_ACC = "#02A3C8"
COLOR_PP = "#F28E8E"
COLOR_BRAKE = "#888888"
y1 <- list(
tickfont = list(color = COLOR_ACC),
title="Degree",
range=c(0, max(all_Drive3$Acceleration))
)
y2 <- list(
tickfont = list(color = COLOR_PP),
overlaying = "y",
side = "right",
title = "Log Perspiration",
showgrid = FALSE,
range=c(-0.6, 0.9)
# range=c(min(all_Drive3$ppLogNormalized), max(all_Drive3$ppLogNormalized))
)
for (p in persons) {
pData <- all_Drive3[(all_Drive3$Subject==as.integer(p) | all_Drive3$Subject==p),]
pData_seg0 <- pData[pData$Phase==0,]
pData_seg1 <- pData[pData$Phase==1 & pData$Activity==3 & pData$Time < 110,]
pData_seg2 <- pData[pData$Phase==2 & pData$Activity==3 & pData$Time < 250,]
pData_seg3 <- pData[pData$Phase==3 & pData$Activity==3 & pData$Time < 350,]
pData_seg4 <- pData[pData$Phase==4 & pData$Activity==3,]
plot_Acc <- plot_ly(pData, x = ~Time, height=400, width=900) %>%
# add_trace(name="Acceleration", y = ~Acceleration, type = 'scatter', mode = 'lines', line=list(width=1.5, color=COLOR_ACC)) %>%
add_trace(name="PP", y = ~ppLogNormalized, type = 'scatter', mode = 'lines', line=list(width=1.5, color=COLOR_PP), yaxis = "y2") %>%
add_segments(x = min(pData$Time), xend = max(pData$Time), y = mean_pp[[p]], yend = mean_pp[[p]],
yaxis = "y2", name="Avg. PP (straight)",
line=list(color="darkgray", dash = 'dot')) %>%
add_segments(x = min(pData$Time), xend = max(pData$Time), y = mean_pp_seg0[[p]], yend = mean_pp_seg0[[p]],
yaxis = "y2", name="Avg. PP (turning)",
line=list(color="black", dash = 'dot')) %>%
add_segments(x = min(pData_seg1$Time), xend = max(pData_seg1$Time), y = mean_pp_seg1[[p]], yend = mean_pp_seg1[[p]],
yaxis = "y2", name="Avg. PP (1st part)",
line=list(color="red", dash = 'dot')) %>%
add_segments(x = min(pData_seg2$Time), xend = max(pData_seg2$Time), y = mean_pp_seg2[[p]], yend = mean_pp_seg2[[p]],
yaxis = "y2", name="Avg. PP (2nd part)",
line=list(color="green", dash = 'dot')) %>%
add_segments(x = min(pData_seg3$Time), xend = max(pData_seg3$Time), y = mean_pp_seg3[[p]], yend = mean_pp_seg3[[p]],
yaxis = "y2", name="Avg. PP (3rd part)",
line=list(color="blue", dash = 'dot')) %>%
add_segments(x = min(pData_seg4$Time), xend = max(pData_seg4$Time), y = mean_pp_seg4[[p]], yend = mean_pp_seg4[[p]],
yaxis = "y2", name="Avg. PP (4th part)",
line=list(color="purple", dash = 'dot')) %>%
layout(
title=paste0("Subject #", p),
xaxis=list(title="Time [s]", range=c(0)),
yaxis=y1,
yaxis2=y2,
margin = list(l = 50, r = 50, b = 50, t = 50, pad = 4),
legend = list(x = 0.5, xanchor = "center", y = 0.2, bgcolor = "rgba(0,0,0,0)", title="Metric", orientation = "h"),
autosize = F
)
plt_AllAcc[[p]] <- plot_Acc
}
htmltools::tagList(plt_AllAcc)
NUMBER_OF_CLUSTERS = 3
color_darkpink = "#e75480"
CLUSTER_BRANCH_COLORS <- c("blue", "darkred", color_darkpink, "black")[1:NUMBER_OF_CLUSTERS]
CLUSTER_LABEL_COLORS <- c("blue", "darkred", color_darkpink, "black")[1:NUMBER_OF_CLUSTERS]
dfPP <- as.data.frame(cbind(
unlist(mean_pp),
unlist(std_pp),
unlist(mean_pp_seg0),
unlist(mean_pp_seg1),
unlist(mean_pp_seg2),
unlist(mean_pp_seg3),
unlist(mean_pp_seg4),
unlist(mean_pp_max),
unlist(std_pp_seg0),
unlist(std_pp_seg1),
unlist(std_pp_seg2),
unlist(std_pp_seg3),
unlist(std_pp_seg4),
unlist(std_pp_max)
))
names(dfPP) <- c("MeanPP", "StdPP",
"MeanPP_Seg0", "MeanPP_Seg1", "MeanPP_Seg2", "MeanPP_Seg3", "MeanPP_Seg4", "MeanPP_SegMax",
"StdPP_Seg0", "StdPP_Seg1", "StdPP_Seg2", "StdPP_Seg3", "StdPP_Seg4", "StdPP_SegMax")
behavioralMatrixClustering <- as.matrix(dfPP)
distMatrix <- dist(behavioralMatrixClustering)
hresults <- distMatrix %>% hclust(method="average")
hc <- hresults %>%
as.dendrogram %>%
set("nodes_cex", NUMBER_OF_CLUSTERS) %>%
set("labels_col", value = CLUSTER_LABEL_COLORS, k=NUMBER_OF_CLUSTERS) %>%
# set("leaves_pch", 19) %>%
# set("leaves_col", value = c("gray"), k=NUMBER_OF_CLUSTERS) %>%
set("branches_k_color", value=CLUSTER_BRANCH_COLORS, k=NUMBER_OF_CLUSTERS)
plot(hc)
legend("topright",
title="Drive=Motoric \nHierachical Clustering",
legend = c("Group 1", "Group 2", "Group 3"),
col = c("darkred", "pink" , "blue"),
pch = c(20,20,20), bty = "n", pt.cex = 1.5, cex = 0.8 ,
text.col = "black", horiz = FALSE, inset = c(0.4, 0.1))

Clustering with SD of PP
library(dendextend)
clusteringDf <- dfPP %>% select(StdPP)
NUMBER_OF_CLUSTERS = 3
color_darkpink = "#e75480"
CLUSTER_BRANCH_COLORS <- c("darkred", "blue", "red")[1:NUMBER_OF_CLUSTERS]
CLUSTER_LABEL_COLORS <- c("darkred", "blue", "red")[1:NUMBER_OF_CLUSTERS]
behavioralMatrixClustering <- as.matrix(clusteringDf)
rownames(behavioralMatrixClustering) <- paste0("#", persons)
distMatrix <- dist(behavioralMatrixClustering)
hresults <- distMatrix %>% hclust
hc <- hresults %>%
as.dendrogram %>%
set("nodes_cex", NUMBER_OF_CLUSTERS) %>%
set("labels_col", value = CLUSTER_LABEL_COLORS, k=NUMBER_OF_CLUSTERS) %>%
# set("leaves_pch", 19) %>%
# set("leaves_col", value = c("gray"), k=NUMBER_OF_CLUSTERS) %>%
set("branches_k_color", value=CLUSTER_BRANCH_COLORS, k=NUMBER_OF_CLUSTERS)
plot(hc)
legend("topright",
title="Drive=Motoric \nChange of Arousal",
legend = c("Exceptional SD" , "Low SD" , "High SD"),
col = c("darkred", "blue" , "red"),
pch = c(20,20,20), bty = "n", pt.cex = 1.5, cex = 0.8 ,
text.col = "black", horiz = FALSE, inset = c(0.0, 0.1))

library(cluster)
silhouette_score <- function(k){
km <- kmeans(clusteringDf, centers = k, nstart=25)
ss <- silhouette(km$cluster, dist(clusteringDf))
mean(ss[, 3])
}
k <- 2:10
avg_sil <- sapply(k, silhouette_score)
plot(k, type='b', avg_sil, xlab='Number of clusters', ylab='Average Silhouette Scores', frame=FALSE)

# Store clustering data
fPath <- str_interp("../data/processed/analysis/TT1_Drive_3_PP.csv")
dfx <- dfPP
dfx <- cbind(persons, dfx)
names(dfx) <- c("Subject" , names(dfPP))
write.csv(dfx, fPath, row.names = F)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnNvdXJjZSgnLi4vc2V0dGluZ3Mvc2V0dGluZ3MuUicpCnNvdXJjZSgnY29tbW9uRnVuY3Rpb25zLlInKQpgYGAKCmBgYHtyfQpwZXJzb25zIDwtIFNFTEVDVEVEX1NVQkpFQ1RTCgphbGxfRHJpdmUzIDwtIHJlYWQuY3N2KCcuLi8vZGF0YS9wcm9jZXNzZWQvZGlzdGFuY2V3aXNlL1RUMV9Ecml2ZV8zXzMwbV8zMG0uY3N2JykKYWxsX0RyaXZlMyRTdWJqZWN0IDwtIGFzLmZhY3RvcihhbGxfRHJpdmUzJFN1YmplY3QpCmFsbF9Ecml2ZTMkbG9nUGVyc3BpcmF0aW9uIDwtIGxvZyhhbGxfRHJpdmUzJFBlcnNwaXJhdGlvbikKYGBgCgoKYGBge3J9Cm1lYW5fcHAgPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMobWVhbl9wcCkgPC0gcGVyc29ucwoKc3RkX3BwIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKHN0ZF9wcCkgPC0gcGVyc29ucwoKIyBTZWdtZW50cwptZWFuX3BwX3NlZzAgPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMobWVhbl9wcF9zZWcwKSA8LSBwZXJzb25zCm1lYW5fcHBfc2VnMSA8LSB2ZWN0b3IobW9kZT0ibGlzdCIsIGxlbmd0aD1sZW5ndGgocGVyc29ucykpIApuYW1lcyhtZWFuX3BwX3NlZzEpIDwtIHBlcnNvbnMKbWVhbl9wcF9zZWcyIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKG1lYW5fcHBfc2VnMikgPC0gcGVyc29ucwptZWFuX3BwX3NlZzMgPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMobWVhbl9wcF9zZWczKSA8LSBwZXJzb25zCm1lYW5fcHBfc2VnNCA8LSB2ZWN0b3IobW9kZT0ibGlzdCIsIGxlbmd0aD1sZW5ndGgocGVyc29ucykpIApuYW1lcyhtZWFuX3BwX3NlZzQpIDwtIHBlcnNvbnMKbWVhbl9wcF9tYXggPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMobWVhbl9wcF9tYXgpIDwtIHBlcnNvbnMKCnN0ZF9wcF9zZWcwIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKHN0ZF9wcF9zZWcwKSA8LSBwZXJzb25zCnN0ZF9wcF9zZWcxIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKHN0ZF9wcF9zZWcxKSA8LSBwZXJzb25zCnN0ZF9wcF9zZWcyIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKHN0ZF9wcF9zZWcyKSA8LSBwZXJzb25zCnN0ZF9wcF9zZWczIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKHN0ZF9wcF9zZWczKSA8LSBwZXJzb25zCnN0ZF9wcF9zZWc0IDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKHN0ZF9wcF9zZWc0KSA8LSBwZXJzb25zCnN0ZF9wcF9tYXggPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMoc3RkX3BwX21heCkgPC0gcGVyc29ucwoKZm9yKHAgaW4gcGVyc29ucykgewogIHBEYXRhIDwtIGFsbF9Ecml2ZTNbKGFsbF9Ecml2ZTMkU3ViamVjdD09YXMuaW50ZWdlcihwKSB8IGFsbF9Ecml2ZTMkU3ViamVjdD09cCksXQogIHBEYXRhX2FjdDMgPC0gcERhdGFbcERhdGEkQWN0aXZpdHk9PTMsXQogIAogIHBEYXRhX3NlZzAgPC0gcERhdGFbcERhdGEkUGhhc2U9PTAsXQogIHBEYXRhX3NlZzEgPC0gcERhdGFbcERhdGEkUGhhc2U9PTEgJiBwRGF0YSRBY3Rpdml0eT09MyAmIHBEYXRhJFRpbWUgPCAxMTAsXQogIHBEYXRhX3NlZzIgPC0gcERhdGFbcERhdGEkUGhhc2U9PTIgJiBwRGF0YSRBY3Rpdml0eT09MyAmIHBEYXRhJFRpbWUgPCAyNTAsXQogIHBEYXRhX3NlZzMgPC0gcERhdGFbcERhdGEkUGhhc2U9PTMgJiBwRGF0YSRBY3Rpdml0eT09MyAmIHBEYXRhJFRpbWUgPCAzNTAsXQogIHBEYXRhX3NlZzQgPC0gcERhdGFbcERhdGEkUGhhc2U9PTQgJiBwRGF0YSRBY3Rpdml0eT09MyxdCiAgCiAgbWVhbl9wcFtbcF1dIDwtIG1lYW4ocERhdGFfYWN0MyRwcExvZ05vcm1hbGl6ZWQpCiAgc3RkX3BwW1twXV0gPC0gc2QocERhdGEkcHBMb2dOb3JtYWxpemVkKQogIG1lYW5fcHBfc2VnMFtbcF1dIDwtIG1lYW4ocERhdGFfc2VnMCRwcExvZ05vcm1hbGl6ZWQpCiAgbWVhbl9wcF9zZWcxW1twXV0gPC0gbWVhbihwRGF0YV9zZWcxJHBwTG9nTm9ybWFsaXplZCkKICBtZWFuX3BwX3NlZzJbW3BdXSA8LSBtZWFuKHBEYXRhX3NlZzIkcHBMb2dOb3JtYWxpemVkKQogIG1lYW5fcHBfc2VnM1tbcF1dIDwtIG1lYW4ocERhdGFfc2VnMyRwcExvZ05vcm1hbGl6ZWQpCiAgbWVhbl9wcF9zZWc0W1twXV0gPC0gbWVhbihwRGF0YV9zZWc0JHBwTG9nTm9ybWFsaXplZCkKICBtZWFuX3BwX21heFtbcF1dIDwtIG1heChtZWFuX3BwX3NlZzFbW3BdXSwgbWVhbl9wcF9zZWcyW1twXV0sIG1lYW5fcHBfc2VnM1tbcF1dLCBtZWFuX3BwX3NlZzRbW3BdXSkKICAKICBzdGRfcHBfc2VnMFtbcF1dIDwtIHNkKHBEYXRhX3NlZzAkcHBMb2dOb3JtYWxpemVkKQogIHN0ZF9wcF9zZWcxW1twXV0gPC0gc2QocERhdGFfc2VnMSRwcExvZ05vcm1hbGl6ZWQpCiAgc3RkX3BwX3NlZzJbW3BdXSA8LSBzZChwRGF0YV9zZWcyJHBwTG9nTm9ybWFsaXplZCkKICBzdGRfcHBfc2VnM1tbcF1dIDwtIHNkKHBEYXRhX3NlZzMkcHBMb2dOb3JtYWxpemVkKQogIHN0ZF9wcF9zZWc0W1twXV0gPC0gc2QocERhdGFfc2VnNCRwcExvZ05vcm1hbGl6ZWQpCiAgc3RkX3BwX21heFtbcF1dIDwtIG1heChzdGRfcHBfc2VnMVtbcF1dLCBzdGRfcHBfc2VnMltbcF1dLCBzdGRfcHBfc2VnM1tbcF1dLCBzdGRfcHBfc2VnNFtbcF1dKQp9CgpgYGAKCmBgYHtyfQpwbHRfQWxsQWNjIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKHBsdF9BbGxBY2MpIDwtIHBlcnNvbnMKCkNPTE9SX0FDQyA9ICIjMDJBM0M4IgpDT0xPUl9QUCA9ICIjRjI4RThFIgpDT0xPUl9CUkFLRSA9ICIjODg4ODg4IgoKeTEgPC0gbGlzdCgKICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBDT0xPUl9BQ0MpLAogIHRpdGxlPSJEZWdyZWUiLAogIHJhbmdlPWMoMCwgbWF4KGFsbF9Ecml2ZTMkQWNjZWxlcmF0aW9uKSkKKQp5MiA8LSBsaXN0KAogIHRpY2tmb250ID0gbGlzdChjb2xvciA9IENPTE9SX1BQKSwKICBvdmVybGF5aW5nID0gInkiLAogIHNpZGUgPSAicmlnaHQiLAogIHRpdGxlID0gIkxvZyBQZXJzcGlyYXRpb24iLAogIHNob3dncmlkID0gRkFMU0UsCiAgcmFuZ2U9YygtMC42LCAwLjkpCiAgIyByYW5nZT1jKG1pbihhbGxfRHJpdmUzJHBwTG9nTm9ybWFsaXplZCksIG1heChhbGxfRHJpdmUzJHBwTG9nTm9ybWFsaXplZCkpCikKCmZvciAocCBpbiBwZXJzb25zKSB7CiAgcERhdGEgPC0gYWxsX0RyaXZlM1soYWxsX0RyaXZlMyRTdWJqZWN0PT1hcy5pbnRlZ2VyKHApIHwgYWxsX0RyaXZlMyRTdWJqZWN0PT1wKSxdCiAgcERhdGFfc2VnMCA8LSBwRGF0YVtwRGF0YSRQaGFzZT09MCxdCiAgcERhdGFfc2VnMSA8LSBwRGF0YVtwRGF0YSRQaGFzZT09MSAmIHBEYXRhJEFjdGl2aXR5PT0zICYgcERhdGEkVGltZSA8IDExMCxdCiAgcERhdGFfc2VnMiA8LSBwRGF0YVtwRGF0YSRQaGFzZT09MiAmIHBEYXRhJEFjdGl2aXR5PT0zICYgcERhdGEkVGltZSA8IDI1MCxdCiAgcERhdGFfc2VnMyA8LSBwRGF0YVtwRGF0YSRQaGFzZT09MyAmIHBEYXRhJEFjdGl2aXR5PT0zICYgcERhdGEkVGltZSA8IDM1MCxdCiAgcERhdGFfc2VnNCA8LSBwRGF0YVtwRGF0YSRQaGFzZT09NCAmIHBEYXRhJEFjdGl2aXR5PT0zLF0KICAKICBwbG90X0FjYyA8LSBwbG90X2x5KHBEYXRhLCB4ID0gflRpbWUsIGhlaWdodD00MDAsIHdpZHRoPTkwMCkgJT4lCiAgICAjIGFkZF90cmFjZShuYW1lPSJBY2NlbGVyYXRpb24iLCB5ID0gfkFjY2VsZXJhdGlvbiwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIGxpbmU9bGlzdCh3aWR0aD0xLjUsIGNvbG9yPUNPTE9SX0FDQykpICU+JSAKICAgIGFkZF90cmFjZShuYW1lPSJQUCIsIHkgPSB+cHBMb2dOb3JtYWxpemVkLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgbGluZT1saXN0KHdpZHRoPTEuNSwgY29sb3I9Q09MT1JfUFApLCB5YXhpcyA9ICJ5MiIpICU+JQogICAgYWRkX3NlZ21lbnRzKHggPSBtaW4ocERhdGEkVGltZSksIHhlbmQgPSBtYXgocERhdGEkVGltZSksIHkgPSBtZWFuX3BwW1twXV0sIHllbmQgPSBtZWFuX3BwW1twXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICB5YXhpcyA9ICJ5MiIsIG5hbWU9IkF2Zy4gUFAgKHN0cmFpZ2h0KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU9bGlzdChjb2xvcj0iZGFya2dyYXkiLCBkYXNoID0gJ2RvdCcpKSAlPiUKICAgIGFkZF9zZWdtZW50cyh4ID0gbWluKHBEYXRhJFRpbWUpLCB4ZW5kID0gbWF4KHBEYXRhJFRpbWUpLCB5ID0gbWVhbl9wcF9zZWcwW1twXV0sIHllbmQgPSBtZWFuX3BwX3NlZzBbW3BdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gInkyIiwgbmFtZT0iQXZnLiBQUCAodHVybmluZykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPWxpc3QoY29sb3I9ImJsYWNrIiwgZGFzaCA9ICdkb3QnKSkgJT4lCiAgICBhZGRfc2VnbWVudHMoeCA9IG1pbihwRGF0YV9zZWcxJFRpbWUpLCB4ZW5kID0gbWF4KHBEYXRhX3NlZzEkVGltZSksIHkgPSBtZWFuX3BwX3NlZzFbW3BdXSwgeWVuZCA9IG1lYW5fcHBfc2VnMVtbcF1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgeWF4aXMgPSAieTIiLCBuYW1lPSJBdmcuIFBQICgxc3QgcGFydCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPWxpc3QoY29sb3I9InJlZCIsIGRhc2ggPSAnZG90JykpICU+JQogICAgYWRkX3NlZ21lbnRzKHggPSBtaW4ocERhdGFfc2VnMiRUaW1lKSwgeGVuZCA9IG1heChwRGF0YV9zZWcyJFRpbWUpLCB5ID0gbWVhbl9wcF9zZWcyW1twXV0sIHllbmQgPSBtZWFuX3BwX3NlZzJbW3BdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gInkyIiwgbmFtZT0iQXZnLiBQUCAoMm5kIHBhcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1saXN0KGNvbG9yPSJncmVlbiIsIGRhc2ggPSAnZG90JykpICU+JQogICAgYWRkX3NlZ21lbnRzKHggPSBtaW4ocERhdGFfc2VnMyRUaW1lKSwgeGVuZCA9IG1heChwRGF0YV9zZWczJFRpbWUpLCB5ID0gbWVhbl9wcF9zZWczW1twXV0sIHllbmQgPSBtZWFuX3BwX3NlZzNbW3BdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gInkyIiwgbmFtZT0iQXZnLiBQUCAoM3JkIHBhcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1saXN0KGNvbG9yPSJibHVlIiwgZGFzaCA9ICdkb3QnKSkgJT4lCiAgICBhZGRfc2VnbWVudHMoeCA9IG1pbihwRGF0YV9zZWc0JFRpbWUpLCB4ZW5kID0gbWF4KHBEYXRhX3NlZzQkVGltZSksIHkgPSBtZWFuX3BwX3NlZzRbW3BdXSwgeWVuZCA9IG1lYW5fcHBfc2VnNFtbcF1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgeWF4aXMgPSAieTIiLCBuYW1lPSJBdmcuIFBQICg0dGggcGFydCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPWxpc3QoY29sb3I9InB1cnBsZSIsIGRhc2ggPSAnZG90JykpICU+JQogICAgbGF5b3V0KAogICAgICB0aXRsZT1wYXN0ZTAoIlN1YmplY3QgIyIsIHApLCAKICAgICAgeGF4aXM9bGlzdCh0aXRsZT0iVGltZSBbc10iLCByYW5nZT1jKDApKSwgCiAgICAgIHlheGlzPXkxLCAKICAgICAgeWF4aXMyPXkyLCAKICAgICAgbWFyZ2luID0gbGlzdChsID0gNTAsIHIgPSA1MCwgYiA9IDUwLCB0ID0gNTAsIHBhZCA9IDQpLAogICAgICBsZWdlbmQgPSBsaXN0KHggPSAwLjUsIHhhbmNob3IgPSAiY2VudGVyIiwgeSA9IDAuMiwgYmdjb2xvciA9ICJyZ2JhKDAsMCwwLDApIiwgdGl0bGU9Ik1ldHJpYyIsIG9yaWVudGF0aW9uID0gImgiKSwKICAgICAgYXV0b3NpemUgPSBGCiAgICApCiAgCiAgcGx0X0FsbEFjY1tbcF1dIDwtIHBsb3RfQWNjCn0KCgpodG1sdG9vbHM6OnRhZ0xpc3QocGx0X0FsbEFjYykKYGBgCgoKYGBge3J9Ck5VTUJFUl9PRl9DTFVTVEVSUyA9IDMKCmNvbG9yX2RhcmtwaW5rID0gIiNlNzU0ODAiCkNMVVNURVJfQlJBTkNIX0NPTE9SUyA8LSBjKCJibHVlIiwgImRhcmtyZWQiLCBjb2xvcl9kYXJrcGluaywgImJsYWNrIilbMTpOVU1CRVJfT0ZfQ0xVU1RFUlNdCkNMVVNURVJfTEFCRUxfQ09MT1JTIDwtIGMoImJsdWUiLCAiZGFya3JlZCIsIGNvbG9yX2RhcmtwaW5rLCAiYmxhY2siKVsxOk5VTUJFUl9PRl9DTFVTVEVSU10KCmRmUFAgPC0gYXMuZGF0YS5mcmFtZShjYmluZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChtZWFuX3BwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3Qoc3RkX3BwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobWVhbl9wcF9zZWcwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobWVhbl9wcF9zZWcxKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobWVhbl9wcF9zZWcyKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobWVhbl9wcF9zZWczKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobWVhbl9wcF9zZWc0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChtZWFuX3BwX21heCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3Qoc3RkX3BwX3NlZzApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChzdGRfcHBfc2VnMSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KHN0ZF9wcF9zZWcyKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3Qoc3RkX3BwX3NlZzMpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChzdGRfcHBfc2VnNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3Qoc3RkX3BwX21heCkKICAgICAgICAgICAgICAgICAgICApKQoKbmFtZXMoZGZQUCkgPC0gYygiTWVhblBQIiwgIlN0ZFBQIiwgCiAgICAgICAgICAgICAgICAgIk1lYW5QUF9TZWcwIiwgIk1lYW5QUF9TZWcxIiwgIk1lYW5QUF9TZWcyIiwgIk1lYW5QUF9TZWczIiwgIk1lYW5QUF9TZWc0IiwgIk1lYW5QUF9TZWdNYXgiLAogICAgICAgICAgICAgICAgICJTdGRQUF9TZWcwIiwgIlN0ZFBQX1NlZzEiLCAiU3RkUFBfU2VnMiIsICJTdGRQUF9TZWczIiwgIlN0ZFBQX1NlZzQiLCAiU3RkUFBfU2VnTWF4IikKCmJlaGF2aW9yYWxNYXRyaXhDbHVzdGVyaW5nIDwtIGFzLm1hdHJpeChkZlBQKQoKZGlzdE1hdHJpeCA8LSBkaXN0KGJlaGF2aW9yYWxNYXRyaXhDbHVzdGVyaW5nKQpocmVzdWx0cyA8LSBkaXN0TWF0cml4ICU+JSBoY2x1c3QobWV0aG9kPSJhdmVyYWdlIikKCmhjIDwtIGhyZXN1bHRzICU+JSAKICAgICAgYXMuZGVuZHJvZ3JhbSAlPiUKICAgICAgc2V0KCJub2Rlc19jZXgiLCBOVU1CRVJfT0ZfQ0xVU1RFUlMpICU+JQogICAgICBzZXQoImxhYmVsc19jb2wiLCB2YWx1ZSA9IENMVVNURVJfTEFCRUxfQ09MT1JTLCBrPU5VTUJFUl9PRl9DTFVTVEVSUykgJT4lCiAgICAgICMgc2V0KCJsZWF2ZXNfcGNoIiwgMTkpICU+JQogICAgICAjIHNldCgibGVhdmVzX2NvbCIsIHZhbHVlID0gYygiZ3JheSIpLCBrPU5VTUJFUl9PRl9DTFVTVEVSUykgJT4lICAgIAogICAgICBzZXQoImJyYW5jaGVzX2tfY29sb3IiLCB2YWx1ZT1DTFVTVEVSX0JSQU5DSF9DT0xPUlMsIGs9TlVNQkVSX09GX0NMVVNURVJTKQoKcGxvdChoYykKbGVnZW5kKCJ0b3ByaWdodCIsIAogICAgIHRpdGxlPSJEcml2ZT1Nb3RvcmljIFxuSGllcmFjaGljYWwgQ2x1c3RlcmluZyIsCiAgICAgbGVnZW5kID0gYygiR3JvdXAgMSIsICJHcm91cCAyIiwgIkdyb3VwIDMiKSwgCiAgICAgY29sID0gYygiZGFya3JlZCIsICJwaW5rIiAsICJibHVlIiksCiAgICAgcGNoID0gYygyMCwyMCwyMCksIGJ0eSA9ICJuIiwgIHB0LmNleCA9IDEuNSwgY2V4ID0gMC44ICwgCiAgICAgdGV4dC5jb2wgPSAiYmxhY2siLCBob3JpeiA9IEZBTFNFLCBpbnNldCA9IGMoMC40LCAwLjEpKQpgYGAKCiMgQ2x1c3RlcmluZyB3aXRoIFNEIG9mIFBQCmBgYHtyfQpsaWJyYXJ5KGRlbmRleHRlbmQpCgpjbHVzdGVyaW5nRGYgPC0gZGZQUCAlPiUgc2VsZWN0KFN0ZFBQKQpOVU1CRVJfT0ZfQ0xVU1RFUlMgPSAzCgpjb2xvcl9kYXJrcGluayA9ICIjZTc1NDgwIgpDTFVTVEVSX0JSQU5DSF9DT0xPUlMgPC0gYygiZGFya3JlZCIsICJibHVlIiwgInJlZCIpWzE6TlVNQkVSX09GX0NMVVNURVJTXQpDTFVTVEVSX0xBQkVMX0NPTE9SUyA8LSBjKCJkYXJrcmVkIiwgImJsdWUiLCAicmVkIilbMTpOVU1CRVJfT0ZfQ0xVU1RFUlNdCgpiZWhhdmlvcmFsTWF0cml4Q2x1c3RlcmluZyA8LSBhcy5tYXRyaXgoY2x1c3RlcmluZ0RmKQpyb3duYW1lcyhiZWhhdmlvcmFsTWF0cml4Q2x1c3RlcmluZykgPC0gcGFzdGUwKCIjIiwgcGVyc29ucykKZGlzdE1hdHJpeCA8LSBkaXN0KGJlaGF2aW9yYWxNYXRyaXhDbHVzdGVyaW5nKQpocmVzdWx0cyA8LSBkaXN0TWF0cml4ICU+JSBoY2x1c3QKCmhjIDwtIGhyZXN1bHRzICU+JSAKICAgICAgYXMuZGVuZHJvZ3JhbSAlPiUKICAgICAgc2V0KCJub2Rlc19jZXgiLCBOVU1CRVJfT0ZfQ0xVU1RFUlMpICU+JQogICAgICBzZXQoImxhYmVsc19jb2wiLCB2YWx1ZSA9IENMVVNURVJfTEFCRUxfQ09MT1JTLCBrPU5VTUJFUl9PRl9DTFVTVEVSUykgJT4lCiAgICAgICMgc2V0KCJsZWF2ZXNfcGNoIiwgMTkpICU+JQogICAgICAjIHNldCgibGVhdmVzX2NvbCIsIHZhbHVlID0gYygiZ3JheSIpLCBrPU5VTUJFUl9PRl9DTFVTVEVSUykgJT4lICAgIAogICAgICBzZXQoImJyYW5jaGVzX2tfY29sb3IiLCB2YWx1ZT1DTFVTVEVSX0JSQU5DSF9DT0xPUlMsIGs9TlVNQkVSX09GX0NMVVNURVJTKQoKcGxvdChoYykKbGVnZW5kKCJ0b3ByaWdodCIsIAogICAgIHRpdGxlPSJEcml2ZT1Nb3RvcmljIFxuQ2hhbmdlIG9mIEFyb3VzYWwiLAogICAgIGxlZ2VuZCA9IGMoIkV4Y2VwdGlvbmFsIFNEIiAsICJMb3cgU0QiICwgIkhpZ2ggU0QiKSwgCiAgICAgY29sID0gYygiZGFya3JlZCIsICJibHVlIiAsICJyZWQiKSwKICAgICBwY2ggPSBjKDIwLDIwLDIwKSwgYnR5ID0gIm4iLCAgcHQuY2V4ID0gMS41LCBjZXggPSAwLjggLCAKICAgICB0ZXh0LmNvbCA9ICJibGFjayIsIGhvcml6ID0gRkFMU0UsIGluc2V0ID0gYygwLjAsIDAuMSkpCmBgYAoKYGBge3J9CmxpYnJhcnkoY2x1c3RlcikKc2lsaG91ZXR0ZV9zY29yZSA8LSBmdW5jdGlvbihrKXsKICBrbSA8LSBrbWVhbnMoY2x1c3RlcmluZ0RmLCBjZW50ZXJzID0gaywgbnN0YXJ0PTI1KQogIHNzIDwtIHNpbGhvdWV0dGUoa20kY2x1c3RlciwgZGlzdChjbHVzdGVyaW5nRGYpKQogIG1lYW4oc3NbLCAzXSkKfQprIDwtIDI6MTAKYXZnX3NpbCA8LSBzYXBwbHkoaywgc2lsaG91ZXR0ZV9zY29yZSkKcGxvdChrLCB0eXBlPSdiJywgYXZnX3NpbCwgeGxhYj0nTnVtYmVyIG9mIGNsdXN0ZXJzJywgeWxhYj0nQXZlcmFnZSBTaWxob3VldHRlIFNjb3JlcycsIGZyYW1lPUZBTFNFKQpgYGAKCmBgYHtyfQojIFN0b3JlIGNsdXN0ZXJpbmcgZGF0YQpmUGF0aCA8LSBzdHJfaW50ZXJwKCIuLi9kYXRhL3Byb2Nlc3NlZC9hbmFseXNpcy9UVDFfRHJpdmVfM19QUC5jc3YiKQpkZnggPC0gZGZQUApkZnggPC0gY2JpbmQocGVyc29ucywgZGZ4KQpuYW1lcyhkZngpIDwtIGMoIlN1YmplY3QiICwgbmFtZXMoZGZQUCkpCndyaXRlLmNzdihkZngsIGZQYXRoLCByb3cubmFtZXMgPSBGKQpgYGAKCgo=